package com.wjw.java.others.final_;

/**
 * final关键字：
 * ------------------------------------------------------------
 * 什么时候使用final：
 * 1.修饰类：该类不能被其他子类继承
 * 2.修饰成员变量(属性)：该成员变量(属性)值不能被修改,必须初始化值
 * 3.修饰方法：该方法不能被其他子类重写
 * 4.修饰局部变量：该局部变量值不能被修改,必须初始化值
 * ------------------------------------------------------------
 * final使用细节：
 * 1.final修饰的属性,又叫常量,一般用xxx_xxx命名
 * 2.final修饰属性时,必须初始化值,且不能再修改值,赋值可以在如下位置
 *   定义时：private final String name = "ACCESS_TOKEN";
 *   在构造器中
 *   在代码块中
 *
 * 3.如果final修饰的属性是static静态的,则初始化的位置只能在
 *   定义时：private final String name = "ACCESS_TOKEN";
 *   静态代码块中,不能在构造器中
 *
 * 4.final类不能被继承,但可以实例化该类的对象
 * 5.如果该类不是final类,但里面有final修饰的方法,那么该类可以被继承,但该方法不能被重写
 * 6.一般来说使用final修饰的类,里面的方法就没必要使用final修饰了
 * 7.final不能修饰构造器
 * 8.final往往和static搭配使用,效率更高,不会导致类加载,底层编译期做了优化
 * 9.String类和包装类(Integer、Double、Float、Boolean等)都是final修饰的
 * ------------------------------------------------------------
 */
public final class Final_ {

    //1.final修饰的属性可以在：定义时初始化值
    private final String name = "USER_WJW";

    //2.final修饰的属性可以在：构造器中初始化值
    private final String password;

    //3.final修饰的属性可以在：{} 代码块中初始化值
    private final int age;

    public Final_(){//2.
        password = "PASS_123";
    }

    {//3.
        age = 30;
    }

    //4.final修饰的static静态属性可以在：定义时初始化值
    private final static String token = "ACCESS_TOKEN";

    //5.final修饰的static静态属性可以在：static {} 静态代码块初始化值
    private final static String token2;

    static {//5.
        token2 = "ACCESS_TOKEN2";
    }

    public static void main(String[] args) {
        //直接调用它的static final修饰的属性,不会类加载,那么静态代码块中的代码也不会被执行
        System.out.println(BBB.result);
    }
}

class BBB{
    public final static int result = 123;
    static {
        System.out.println("final往往和static搭配使用,效率更高,不会导致类加载");
    }
}
